<?php
/**
 * Controller_Ajax
 *
 * Класс Controller_Ajax отвечает за обработку ajax-обращений
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Controller_Ajax extends Controller_Base {

	public $arrReturn = null;
	public $usePlainText = false;

	/**
	 * Конструктор контроллера
	 *
	 * @param array $arrRequest - Массив, содержащий информацию о запросе к странице (элементы массива  - то что между слешами в URL)
	 * @param bool $useContentHeader - Использовать ли заголовок Content-type 
	 */
	public function __construct(&$arrRequest, $useContentHeader = true) {
	  Service_Debug::setDebug();
		if ($useContentHeader) header('Content-Type: text/javascript; charset=utf-8');
		parent::__construct($arrRequest);
	}

	/**
	 * Метод возвращает сообщение о 404 ошибке
	 *
	 */
	public function showError() {
		switch ($this->error) {
			case 404:
				echo '{"result": "error", "error": "Такой страницы не существует."}';
				break;
			case 403:
				echo '{"result": "error", "error": "Недостаточно прав для доступа к странице."}';
				break;
			case 503:
				echo '{"result": "error", "error": "Сервис временно недоступен."}';
				break;				
			default:
				echo '{"result": "error", "error": "Произошла неизвестная ошибка."}';
				break;
		}
	}
	
	/**
	 * Выбираем действие исходя из URL ++++
	 *
	 */
	public function action() {
	  Service_Debug::setDebug();
	  Pressure::setStart();
	  try {
		  $this->actionSwitch();
		}
		catch (Exception $e) {
			if ($e instanceof Exception_SiteError) throw $e;
		  $this->makeStandardError($e->getMessage());
		}	
		if (DEBUG && !$this->error) {
			$objDebug = Service_Debug::instance();
			$this->arrReturn['debug'] = $objDebug->getDebug($this->arrReturn);
		}
		$this->arrReturn['duration'] = Pressure::calculateCurrentDuration();
		if (!$this->error) {
			if (!$this->usePlainText) {
				if(isset($_GET['callback']) && stripos($_GET['callback'], 'jQuery') === 0) {
					echo $_GET['callback'] . "(" . json_encode($this->arrReturn, JSON_HEX_QUOT | JSON_HEX_APOS) . ");";
				} 
				else echo json_encode($this->arrReturn, JSON_HEX_QUOT | JSON_HEX_APOS);
			}
		}
	}
	
	/**
	 * Функция определяет, какое именно действие необходимо осуществить
	 * 
	 */
	public function actionSwitch() {
		throw new Exception_SiteError('', 404);
	}
	
	/**
	 * 
	 * Создает стандартную ошибку для отправки клиенту (при возврате JSON)
	 * @param string $errText
	 */
	public function makeStandardError($errText) {
		$this->arrReturn = array('result' => 'error', 'error' => $errText);
		return false;
	}
	
	/**
	 * 
	 * Создает стандартную ошибку для отправки клиенту (при загрузке файлов)
	 * @param string $errText
	 */
	public function makeUploadStandardError($errText) {
		$this->arrReturn = array('result' => 'error', 'error' => $errText);
	  echo json_encode($this->arrReturn);
	  exit();
	}		
}